分享主軸
JSON Web Token 的縮寫,是一種基於 RFC 7519 的開放標準,以 JSON 物件的形式安全傳遞,這些物件可以被驗證和信任,因為它經過數位簽屬
可以使用 HMAC 或使用 RSA 或 ECDSA 等演算法進行簽名
可以看成三個部分,以 . 區分,如下範例
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
{
"alg": "HS256",
"typ": "JWT"
}
Registered Claims : 標準聲明,可以放,不強制
iss(Issuer):發行者,JWT 的發行者
sub(Subject):用戶的唯一標識,通常是所面向的用戶(為了哪個用戶而簽發的)
aud(Audience):接收者,JWT 的接收者
exp(Expiration Time):過期時間,JWT 的過期時間
nbf(Not Before):生效時間,JWT 在此時間之前無效
iat(Issued At):簽發時間,JWT 的簽發時間
jti(JWT ID):JWT ID,JWT 的唯一ID,用於防止惡意使用者一直使用
Public Claims : 允許自訂義聲明,但避免名稱衝突 (不與 IANA JSON Web Token Registry 內的名稱有衝突 ),可向官方申請自定義的聲明
Private Claims : 允許自訂義聲明,不受標準限制 ( 不需要在 IANA JSON Web Token Registry 中註冊 )
小差異
{
"sub": "1234567890",
"name": "Mars",
"admin": true
}
解釋 Signature 生成步驟
使用 Base64Url 編碼將 Header 和 Payload 轉換為字符串
base64UrlEncode(header) + "." + base64UrlEncode(payload)
將編碼後的 Header 和 Payload 用點(.)連接起來
base64UrlEncode(header) + "." + base64UrlEncode(payload)
使用指定的演算法(例如 HMAC SHA256)和密鑰串聯後,進行簽名
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
將簽名結果進行 Base64Url 編碼,得到最終的 Signature
base64UrlEncode(HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret))
安裝套件
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
設定檔內
"JWT": {
"Key": "YourSecretKeyHereWithAtLeast32Characters",
"Issuer": "YourIssuer",
"Audience": "YourAudience"
}
Program.cs
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = builder.Configuration["JWT:Issuer"],
ValidAudience = builder.Configuration["JWT:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["JWT:Key"]!))
};
});
呼叫的地方
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, login.Username),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JWT:Key"]!));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: _configuration["JWT:Issuer"],
audience: _configuration["JWT:Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
結果
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJNYXJzIiwianRpIjoiYTVkMjVjMjctMmY1OS00OWMwLWJkNTQtZjMxMDQ3MjMxZDExIiwiZXhwIjoxNzI3NzcxODAwLCJpc3MiOiJZb3VySXNzdWVyIiwiYXVkIjoiWW91ckF1ZGllbmNlIn0.beBeDsY4yCULA3tSXPEEduDKTDkHOiIKZrO1ejzAiVA
產出的 JWT 結構
圖中可以看到上面介紹的三大部分結構,就是 JWT 的組成
今日結語
了解如何應用在 ASP .NET Core 內實作 JWT Token,這種方式很常見,比如登入等等,也更了解 JWT 到底是什麼
一步一腳印,慢慢累積程式知識,加油 ~
明天繼續努力!
提供官方網址
https://jwt.io/